home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / xl.h.z / xl.h
C/C++ Source or Header  |  1992-04-03  |  30KB  |  744 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1989, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12.  
  13. #ident "$Revision: 1.28 $"
  14. #ifndef _XL_H_
  15. #define _XL_H_
  16.  
  17. /******************************************************************************
  18. DEFINE: misc_defs.h - miscellaneous definitions 
  19. *******************************************************************************
  20. DESCRIPTION:
  21.          This file defines miscellaneous constants for code compatability
  22.     and readability.
  23.  
  24. ******************************************************************************/
  25.  
  26.  
  27. /* Bit Definitions. */
  28.  
  29. #define BIT0        0x01
  30. #define BIT1        0x02
  31. #define BIT2        0x04
  32. #define BIT3        0x08
  33. #define BIT4        0x10
  34. #define BIT5        0x20
  35. #define BIT6        0x40
  36. #define BIT7        0x80
  37.  
  38. #define B_RAW        B_MAP        /* Flag indicating if a buf is Raw */
  39.  
  40. /******************************************************************************
  41. DEFINE: config.h - configurable constants 
  42. *******************************************************************************
  43. DESCRIPTION:
  44.          This file defines the driver's configurable constants.  These
  45.     constants  determine the  number of IOPBs and bufs the driver will
  46.     have  available  for use,  plus the number of tables per type that
  47.     will be allocated.
  48.  
  49. ******************************************************************************/
  50.  
  51. #define    BUFS    10    /* Number of Bufs Driver will use */
  52.  
  53. #define POLLED        0    /* Interrupt level for polled commands    */
  54.  
  55. /* Silicon Graphics specific constants:        */
  56.  
  57. #define VOL_ADR        0    /* Logical block number for volume header */
  58.                 /* cyl = 0, head = 0, sector = 0      */
  59.  
  60. /* The following indicate the possible states of a unit as specified in */
  61. /* the Unit Table field u_status.                    */
  62.  
  63. #define NOT_ATT        0    /* Unit is not attached            */
  64. #define OPENED        0x01    /* Unit is open             */
  65. #define ATTACHED    0x02    /* Unit has been attached        */
  66. #define VH_VALID    0x04    /* Unit has a valid volume header    */
  67.  
  68. #define LNKLST        3    /* Shift count for link list length in IOPB */
  69. #define NSCAT        64    /* Max number of S/G elements        */
  70. #define LSCAT           32      /* Number of S/G entries per list       */
  71. #define NXTSGCNT        0       /* S/G entry with next count field      */
  72.  
  73.  
  74. /******************************************************************************
  75. DEFINE: constants.h - non-configurable constants 
  76. *******************************************************************************
  77. DESCRIPTION:
  78.          This file includes the definition of the constants that are
  79.     controller-IOPB  specific  and  driver  data structure specific. 
  80.     The names for IOPB fields are  assigned in this file, along with
  81.     the bit definitions  within a  field.  The values to be assigned
  82.     to the different  IOPB  fields are defined  as determined by the
  83.     754 controller.  The constants for manipulating the controller's
  84.     registers are also declared in this file.
  85.  
  86. ******************************************************************************/
  87.  
  88.               /* GENERIC DISK DRIVE STATUS */
  89.  
  90. /* IOPB COMMAND BYTE. */
  91.  
  92. #define SGM            BIT4          /* Scatter/Gather Enable. */
  93. #define CHEN           BIT5          /* Chain Enable.          */
  94. #define DONE_BIT       BIT6          /* Done Bit.              */
  95. #define ERRS           BIT7          /* Error Summary Bit.     */
  96.  
  97. /* DRIVE PARAMETERS MODIFICATION - BYTE 6. */
  98.  
  99. #define EC32           BIT4          /* 48/32 Bit ECC.        */
  100. #define SSF            BIT5          /* Soft sectored format. */
  101. #define ESD            BIT6          /* Embedded Servo Drive. */
  102. #define AFE            BIT7          /* Alternate Field Enable. */
  103.  
  104. /* CONTROLLER PARAMETERS MODIFICATION - BYTE 8. */
  105.  
  106. #define AIOR          (BIT0 | BIT1)  /* AIO Response Time.            */
  107. #define NPRM           BIT2          /* Non-privilaged Register Mode. */
  108. #define EDT            BIT3          /* Enable DMA Timeout.           */
  109. #define ICS            BIT4          /* IOPB Checksum Enable.         */
  110. #define DACF           BIT5          /* Disable ACFAIL.               */
  111. #define TMOD           BIT6          /* Transfer Mode.                */
  112. #define AUD            BIT7          /* Auto Update.                  */
  113.  
  114. /* CONTROLLER PARAMETERS MODIFICATION - BYTE 9. */
  115.  
  116. #define ROR            BIT4          /* Release On Request. */
  117. #define TDT           (BIT6 | BIT7)  /* Throttle Dead Time. */
  118.  
  119. /* CONTROLLER PARAMETERS MODIFICATION - BYTE A. */
  120.  
  121. #define ECCM          (BIT0 | BIT1)  /* ECC Mode.                */
  122. #define RBC            BIT2          /* Retry Before Correction. */
  123. #define ASR            BIT4          /* Auto Seek Retry.         */
  124. #define OVS            BIT7          /* Overlap Seek Enable.     */
  125.  
  126. #define ECC_M0         0             /* ECC Mode 0 */
  127. #define ECC_M1         1             /* ECC Mode 1 */
  128. #define ECC_M2         2             /* ECC Mode 2 */
  129.    
  130. /* CONTROL/STATUS REGISTER. */
  131.  
  132. #define CLRBS    BIT0    /* (W) Clear Register Busy Semaphore.  */ 
  133. #define RBS      BIT0    /* (R) Register Busy Semaphore.        */
  134. #define CLRIO    BIT1    /* (W) Clear Remove IOPB Bit.          */
  135. #define RIO      BIT1    /* (R) Remove IOPB Status.             */
  136. #define AIO      BIT2    /* (W) Add IOPB.                       */
  137. #define AIOP     BIT2    /* (R) Add IOPB Pending Status.        */
  138. #define RESET    BIT3    /* (W) Controller Reset.               */
  139. #define RESETA   BIT3    /* (R) Controller Reset Active.        */
  140. #define MM       BIT5    /* (W) Maintenance Mode Bit.           */
  141. #define MMA      BIT5    /* (R) Maintenance Mode Active Status. */
  142. #define FERR     BIT6    /* (R) Fatal Error Status.             */
  143. #define BUSY     BIT7    /* (R) Ctlr Busy Processng IOPB.       */
  144.  
  145.  
  146. /* IOPB RELATED CONSTANTS */
  147.  
  148. #define    IOPB_SIZE      0x1d
  149.  
  150. #define COMMAND        0x00          /* Command codes.                 */
  151. #define COMPCODE       0x01          /* Completion codes.              */
  152. #define DISKSTAT       0x02          /* Disk status.                   */
  153. #define STAT3          0x03          /* Status 3 byte.                 */
  154. #define SUBFUNC        0x04          /* Subfunction byte.              */
  155. #define UNIT           0x05          /* Unit number.                   */
  156. #define LEVEL          0x06          /* Interrupt level.               */
  157. #define DRV_PARM       0x06          /* Drive parameters modification. */
  158. #define INTERLEAVE     0x06          /* Format parameters interleave.  */
  159. #define VECTOR         0x07          /* Interrupt vector.              */
  160. #define COUNTH         0x08          /* Byte count high.               */
  161. #define CTLRPAR1       0x08          /* Controller parameters 1.       */
  162. #define SECTS_LH       0x08          /* Sectors on last head.          */
  163. #define FLD_1          0x08          /* Format parameters field 1.     */
  164. #define COUNTL         0x09          /* Byte count low.                */
  165. #define CTLRPAR2       0x09          /* Controller parameters 2.       */
  166. #define HDOFFSET       0x09          /* Head offset.                   */
  167. #define FLD_2          0x09          /* Format parameters field 2.     */
  168. #define CYLH           0x0a          /* Cylinder number high.          */
  169. #define CTLRPAR3       0x0a          /* Controller parameters 3.       */
  170. #define FLD_3          0x0a          /* Format parameters field 3.     */
  171. #define CYLL           0x0b          /* Cylinder number low.           */
  172. #define THROTTLE       0x0b          /* Controller parms throttle.     */
  173. #define FLD_4          0x0b          /* Format parameters field 4.     */
  174. #define HEAD           0x0c          /* Head number.                   */
  175. #define FLD_5H         0x0c          /* Format parameters field 5 Hi.  */
  176. #define FW_REL         0x0c          /* Firmware Revision Number       */
  177. #define AUTOSCT           0x0c         /* Auto configure sector size (word) */
  178. #define SECTOR         0x0d          /* Sector number.                 */
  179. #define FLD_5L         0x0d          /* Format parameters field 5 Lo.  */
  180. #define DATA_MOD       0x0e          /* Data address modifier.         */
  181. #define ACT_SECTORS    0x0e          /* Actual no. of sectors/track.   */
  182. #define CTLR_TYPE      0x0e          /* Controller Type                */
  183. #define FLD_12         0x0e          /* Format parameters field 12.    */
  184. #define IOPB_MOD       0x0f          /* IOPB address modifier.         */
  185. #define PNUMH          0x10          /* Eprom Part Number-High Byte    */
  186. #define DATA1          0x10          /* Data address byte 1.           */
  187. #define FLD_6          0x10          /* Format parameters field 6.     */
  188. #define STATUSH           0x10         /* ESDI command status.           */
  189. #define PNUML          0x11          /* Eprom Part Number-Low Byte     */
  190. #define DATA2          0x11          /* Data address byte 2.           */
  191. #define FLD_7          0x11          /* Format parameters field 7.     */
  192. #define DATA3          0x12          /* Data address byte 3.           */
  193. #define FLD_5AH        0x12          /* Format parameters field 5 Alt Hi*/
  194. #define REVISION       0x12          /* Revision number of controller.  */
  195. #define ESDI_CMD       0x12          /* ESDI command code.         */
  196. #define DATA4          0x13          /* Data address byte 4.           */
  197. #define FLD_5AL        0x13          /* Format parameters field 5 Alt Lo*/
  198. #define SUBREV         0x13          /* Sub-revision number of ctlr.   */
  199. #define NIOPB1         0x14          /* Next IOPB address byte 1.      */
  200. #define NIOPB2         0x15          /* Next Iopb address Byte 2.      */
  201. #define NIOPB3         0x16          /* Next Iopb address Byte 3.      */
  202. #define NIOPB4         0x17          /* Next Iopb address Byte 4.      */
  203. #define CHECKH         0x18          /* Checksum high byte.            */
  204. #define CHECKL         0x19          /* Checksum low byte.             */
  205. #define ECCPH          0x1a          /* ECC pattern word high.         */
  206. #define ECCPL          0x1b          /* ECC pattern word low.          */
  207. #define ECCOH          0x1c          /* ECC offset word high.          */
  208. #define ECCOL          0x1d          /* ECC offset word low.           */
  209.  
  210.  
  211.        /* 754 CONTROLLER DISK COMMANDS AND SUBFUNCTIONS */
  212.  
  213.                   /* NO OPERATION */
  214.  
  215. #define NOP             0x0
  216.  
  217.                     /* WRITE */
  218.  
  219. #define WRITE           0x1
  220.  
  221.                     /* READ */
  222.  
  223. #define READ            0x2
  224.  
  225.                     /* SEEK */
  226.  
  227. #define SEEK            0x3
  228.  
  229. #define REPORT          0x00  /* Report Current Address */
  230. #define SEEK_REPORT     0x01  /* Seek & Report Current Address */
  231. #define SEEK_START      0x02  /* Seek Start */
  232.  
  233.                     /* RESET */
  234.  
  235. #define DRIVE_RESET     0x4   /* Drive Reset */
  236.  
  237.                /* WRITE PARAMETERS */
  238.  
  239. #define WRITE_PAR       0x5
  240.  
  241. #define W_CONTROLLER    0x00  /* Write Control Parameters */
  242. #define W_DRIVE         0x80  /* Write Drive Parameters */
  243. #define W_FORMAT        0x81  /* Write Drive Format Parameters */
  244. #define W_CONFIG        0xb0  /* ESDI - Write Drive Configuration */
  245. #define W_AUTOCNF       0xb2  /* ESDI - Auto Configure */
  246.  
  247.                /* READ PARAMETERS */
  248.  
  249. #define READ_PAR        0x6
  250.  
  251. #define R_CONTROLLER    0x00  /* Read Control Parameters */
  252. #define R_DRIVE         0x80  /* Read Drive Parameters */
  253. #define R_FORMAT        0x81  /* Read Controller Format Parameters */
  254. #define R_STATUS_SMD    0xa0  /* SMD - Read Drive Status Extended */
  255. #define R_STATUS_ESDI   0xb0  /* ESDI - Read Drive Status Extended */
  256. #define R_CONFIG        0xb1  /* ESDI - Read drive configuration */
  257.  
  258.                /* WRITE/READ PARAMETERS */
  259.         /* Used when direction doesn't matter */
  260.  
  261. #define CTLRP           0x00  /* Control Parameters */
  262. #define DRV             0x80  /* Drive Parameters */
  263. #define MEDIA           0x81  /* Media Format Parameters */
  264.  
  265.                /* EXTENDED WRITE */
  266.  
  267. #define EXT_WRITE       0x7
  268.  
  269. #define W_TRK_HDR       0x80  /* Write Track Headers */
  270. /* #define W_FORMAT     0x81  Write Format is already defined in Write Parms */
  271. #define W_HDE           0x82  /* Write Hdr, Hdr ECC, Data & Data ECC */
  272. #define W_DEF_SMD       0xa0  /* SMD - Write Defect Map */
  273. #define W_DEF_EXT_SMD   0xa1  /* SMD - Write Defect Map extended */
  274. #define W_DEF_ESDI      0xb0  /* ESDI - Write Defect Map */
  275.  
  276.                /* EXTENDED READ */
  277.  
  278. #define EXT_READ        0x8
  279.  
  280. #define R_TRK_HDR       0x80  /* Read Track Headers */
  281. #define RW_CHECK        0x81  /* Read/Write Check Data (Verify) */
  282. #define R_HDE           0x82  /* Read Hdr, Hdr ECC, Data & Data ECC */
  283. #define R_DEF_SMD       0xa0  /* SMD - Read Defect Map */
  284. #define R_DEF_EXT_SMD   0xa1  /* SMD - Read Defect Map extended */
  285. #define R_DEF_ESDI      0xb0  /* ESDI - Read Defect Map */
  286. #define R_DEF_IPI    0xc4  /* IPI - Read Defect Map */
  287.  
  288.         /* PASSTHROUGH */
  289. #define XL_PASSTHRU    0xa
  290.  
  291. #define XL_READFORMAT    0x42
  292. #define XL_READCONFIG    0x41
  293.  
  294.                /* SEND OPTIONAL */
  295.  
  296. #define SEND_OPT        0xc 
  297.  
  298. /*  COMPLETION CODE ERROR TYPES - UPPER BYTE MASKS */
  299.  
  300. #define STATUS_ONLY          0x0   /* 0x00 - 0x0F */
  301. #define PROGRAMMING_ERROR    0x1   /* 0x10 - 0x1F */
  302. #define NO_RETRY             0x2 
  303. #define SOFT_ERROR         0x3
  304. #define RETRY              0x4
  305. #define RESET_RETRY         0x6
  306. #define FATAL_HW         0x7
  307. #define MISC_ERROR         0x8
  308. #define INTERVENTION         0x9
  309. #define CTLR_FATAL_ERROR     0xd   /* 0xD0 - 0xDF */
  310.  
  311.           /*  SIGNIFICANT COMPLETION CODES FOR THE DRIVER */
  312.  
  313. #define SW_TIMEOUT        0xD0 /* Driver Timeouted the Iopb */
  314. #define SW_HW_FATAL        0xD1 /* Fatal Hardware Error caused Task to Abort */
  315.  
  316.                      /* HEXIDECIMAL MASKS */
  317.  
  318. #define CYL_MASK    0xffff0000 /* Used in conjunction with Disk */
  319. #define HD_MASK        0x0000ff00 /* Addresses packed into 32 Bit  */
  320. #define SEC_MASK    0x000000ff /* Integers                      */
  321.  
  322. #define HI_NIBBLE    0xf0
  323. #define LO_NIBBLE    0x0f
  324.  
  325.             /* SOFTWARE TABLE FEATURES CONSTANTS */
  326.  
  327. #define    DEBUG_MSG    BIT0    /* Enables More Extensive Error Message */
  328. #define    RETRY_MSG    BIT1    /* Enables Retry Message */
  329. #define STATUS_MSG    BIT2    /* Enables Status Only Error Message */
  330. #define BIG_BOOT_MSG    BIT3    /* Enables More Extensive Boot Message */
  331. #define DISABLE_MSG    BIT4    /* Disables all Run-Time Error Messages */
  332. #define QUEUE_MSG    BIT7    /* Enables Warning Messages from Queueing Fns */
  333.  
  334.                    /* MISC. CONSTANTS */
  335.  
  336. #define SEC_HDR_SIZE    0x4  /* No. of Bytes in a Sector's Track Header */
  337. #define DEFECT_MAP_SIZE    0x18 /* No. of Bytes in a Track's Defect Map */
  338. #define REMAP_SECTOR    0xcc
  339. #define SPARE_SECTOR    0xdd
  340. #define BAD_SECTOR      0xee
  341.  
  342. typedef struct xylhbuf {
  343.     sema_t    b_bufsem;        /* To wait for a free buffer */
  344.     lock_t    b_splock;        /* Locks the buf en_q, de_q routines */
  345.     struct    buf    *b_forw;
  346.     struct    buf    *b_back;
  347. } BUFHD;
  348.  
  349. /*    
  350.  *                REGISTERS
  351.  *    
  352.  *    The Controller's Register Set is Memeory Mapped, so to the Driver it 
  353.  *    appeares as a simple local data structure.  At system Boot the Kernel's
  354.  *    configured address is set up in the Driver and all subsequent Register
  355.  *    Accesses Effect the actual Controller.
  356.  */    
  357.  
  358. struct xylregs {
  359.     
  360.     unchar    fill_1;     /* Simple Place Holder */
  361.     unchar    addr_1;        /* Least Significant Address Register */
  362.     unchar    fill_2;
  363.     unchar    addr_2;     /* Next Least Significant Address Register */
  364.     unchar    fill_3;
  365.     unchar    addr_3;     /* More Significant Address Register */
  366.     unchar    fill_4;
  367.     unchar    addr_4;     /* Most Significant Address Register */
  368.     unchar    fill_5;
  369.     unchar    modifier;   /* Address Modifier Register */
  370.     unchar    fill_6;
  371.     unchar    csr;        /* Control/Status Register */
  372.     unchar    fill_7;
  373.     unchar    fatal;      /* Fatal Error Register */
  374.     };
  375.  
  376. typedef struct xylregs REGISTERS;
  377.  
  378. /*
  379.  *                IOPB
  380.  *    
  381.  *    The Iopb is the structure used to pass commands to the Controller.  The
  382.  *    Driver's main function is to translate 'bufs' into Iopbs and make the
  383.  *    Controller execute them.
  384.  */
  385.  
  386. typedef struct
  387.     {
  388.     short         count;        /* DMA transfer count for entry */
  389.         unchar       nxt_sg;            /* Next S/G list length         */
  390.     unchar         adr_mod;        /* Address modifier        */
  391.     long         dma_adr;        /* DMA address            */
  392.     } SGTYPE;
  393.  
  394. typedef struct iopb
  395.     {
  396. #if R4000
  397.     unchar      *byte;          /* Bytes the Controller Knows About */
  398. #else
  399.     unchar       byte[IOPB_SIZE]; /* Bytes the Controller Knows About */
  400. #endif
  401.     buf_t       *buf;             /* Address of Associated buf */
  402.     short         ctlr;          /* Controller currently using this iopb */
  403.     short        cycles;          /* Time-Out Counter */
  404.     struct iopb *q_front;          /* Double-linked list of active iopb's */
  405.     struct iopb *q_back;          /* Double-linked list of active iopb's */
  406. #if defined(IP5) || defined(IP17)
  407.     dmamap_t    *u_dmamap;        /* dmamap used for scatter/gather */
  408. #else
  409.         SGTYPE         sglist[NSCAT];   /* Scatter/Gather list    */
  410. #endif
  411.     } IOPB, *IOPBPTR;
  412.  
  413.  
  414. /*    
  415.  *                HEAD_NODE
  416.  *    
  417.  *      This head node is used for the Free IOPB queue.  The buf queues
  418.  *    use the system defined 'bufhd' as their head nodes.    
  419.  */
  420.  
  421. typedef struct
  422.     {
  423.     IOPBPTR    back;        /* Address of Last Node On Queue */
  424.     IOPBPTR    front;        /* Address of 1st Node On Queue */
  425.     IOPBPTR base;          /* start of iopbs for this ctlr (KSEG1) */
  426.     lock_t    iopblock;    /* Lock access to this struct */
  427.     } HEAD_NODE;
  428.  
  429. /*    
  430.  *            IOCTL REQUEST TABLE
  431.  *    
  432.  *    This table is used to pass information between the Driver and the
  433.  *    User during Special Function Requests.  What the table contains is
  434.  *    directly related to the specific task(s) involved.
  435.  */
  436. typedef struct
  437. {
  438.     unchar i_status;/* Used to pass Iopb Comp. Code between memory spaces */
  439.     short  par_1;   /* Used to pass simple integers between memory spaces */
  440.     short  par_2;   /*             "                     "                */
  441.     short  par_3;   /*             "                     "                */
  442.     long   par_4;   /*             "                     "                */
  443.     unchar   *ptr_1;  /* Used to Pass Addresses between memory spaces     */
  444.     unchar   *ptr_2;  /*             "                     "              */
  445.     unchar   *ptr_3;  /*             "                     "              */
  446. } IOCTL_TABLE;
  447.  
  448. /*
  449.  *    CONTROLLER PARAMETERS TABLE
  450.  *    
  451.  *    This table is used by the Driver to reflect the actually or potential
  452.  *    Controller parameters.
  453.  *      NOTE: See 754 Controller User's Manual - Set/Read Controller Parameters
  454.  */
  455. typedef struct
  456. {
  457.     unchar       c_status;/* Debug Use Only */   
  458.     unchar       c_par1;  /* Corresponds to Iopb Byte 0x8 */
  459.     unchar       c_par2;  /* Corresponds to Iopb Byte 0x9 */
  460.     unchar       c_par3;  /* Corresponds to Iopb Byte 0xa */
  461.     unchar       c_throt; /* Corresponds to Iopb Byte 0xb */
  462.     unchar       c_type;  /* Corresponds to Iopb Byte 0xe */
  463.     char      *c_name;  /* String used when displaying Ctlr related info. */
  464.         unchar       c_level; /* Controller interrupt level   */
  465.         unchar       c_vector;/* Controller interrupt vector  */
  466.         REGISTERS *c_adr;   /* Registers base address       */
  467.         short       c_eprom; /* Firmware part number         */
  468.         short      c_fwrel; /* Firmware release number      */
  469.         short      c_fwrev; /* Firmware revision number     */ 
  470. } CONTROLLER_TABLE;
  471.  
  472. /* Per-controller software status and locking structure */
  473. typedef struct xyl_ctlrinfo
  474. {
  475.     sema_t          cl_stsem;    /* Semaphores the various data structures */
  476.     lock_t          cl_lock;    /* Locks ctlr registers and buffer queues */
  477.     int          cl_toid;    /* Timeout id, 0 when no timeout pending */
  478.     struct iobuf *c_qfront;    /* pointer to first active unit queue */
  479.     struct iobuf *c_qback;    /* pointer to last active unit queue */
  480. } XYL_CTLRINFO;
  481.  
  482. /*    MEDIA FORMAT PARAMETERS TABLE
  483.  *    
  484.  *     This table is used by the Driver to reflect the actually or potential
  485.  *     Media Format parameters. (ie. the way actual sectors look on the disk)
  486.  *     NOTE: See 754 Controller User's Manual - Set/Read Media Format Parameters
  487.  */
  488. typedef struct
  489. {
  490.     unchar    interleave; /* Corresponds to Iopb Byte 0x6  */
  491.     unchar    fld_1;      /* Corresponds to Iopb Byte 0x8  */
  492.     unchar    fld_2;      /* Corresponds to Iopb Byte 0x9  */
  493.     unchar    fld_3;      /* Corresponds to Iopb Byte 0xa  */
  494.     unchar    fld_4;      /* Corresponds to Iopb Byte 0xb  */
  495.     unchar    fld_5H;     /* Corresponds to Iopb Byte 0xc  */
  496.     unchar    fld_5L;     /* Corresponds to Iopb Byte 0xd  */
  497.     unchar    fld_12;     /* Corresponds to Iopb Byte 0xe  */ 
  498.     unchar    fill_2;     /* Not Applicable to 754 Ctlr    */
  499.     unchar    fld_6;      /* Corresponds to Iopb Byte 0x10 */
  500.     unchar    fld_7;      /* Corresponds to Iopb Byte 0x11 */
  501.     unchar    fld_5AH;    /* Corresponds to Iopb Byte 0x12 */
  502.     unchar    fld_5AL;    /* Corresponds to Iopb Byte 0x13 */
  503. } MEDIA_FORMAT_TABLE;
  504.  
  505. /*
  506.  *    PARTITION TABLE
  507.  *    
  508.  *    This table is used by the Driver to reflect the actually or potential
  509.  *    Logical Partition Boundries for a particular physical Unit.
  510.  */
  511. typedef struct
  512. {
  513.     unchar    p_status;  /* Debug Use Only */
  514.     long    first;     /* Physical Sector corresponding to Sector '0' in */
  515.                /* the Logical Partition of the Drive             */
  516.     long    length;    /* Number of Sectors encompassed by the Partition */
  517. } PARTITION_TABLE;
  518.  
  519. /*
  520.  *    UNIT PARAMETERS TABLE
  521.  *    
  522.  *    This table is used by the Driver to reflect the actually or potential
  523.  *    Drive parameters for a particular Unit.
  524.  *      NOTE: See 754 Controller User's Manual - Set/Read Drive Parameters
  525.  */
  526. typedef struct
  527. {
  528.     unchar                u_status;    /* Used to Store OPEN/CLOSED Status  */
  529.     unchar                drv_param;   /* Corresponds to Iopb Byte 0x6      */
  530.     unchar              sects_lh;    /* Sectors Configured on Last Tracks */
  531.     short                cylinders;   /* Cylinders Configured              */
  532.     unchar                heads;       /* Heads Configured                  */
  533.     unchar                sectors;     /* Sectors Configured                */
  534.     unchar                act_sects;   /* Actual Number of Secs on a track  */
  535.     unchar                track_spares;/* Sectors Set Aside for Slipping    */
  536.     unchar                 alt_tracks;  /* Tracks per Cylinder Set Asside    */
  537.     short            secs_per_cyl;/* Configured Sectors Per Cylinder   */
  538.     MEDIA_FORMAT_TABLE *media_format;/* Address of Associated Format Tab  */
  539.     PARTITION_TABLE       *partitions;  /* Address of Associated Part. Tab   */
  540.     char           *name;        /* String used in Unit Spec. msgs.   */
  541.     short           *sect_size;   /* Pointer into Media Format Table's
  542.                               applicable Sector Size Fields   */
  543.        short            bps;     /* Bytes per sector (ESDI status)    */
  544.     short            registered;  /* 1 = registered in SGI hinv        */
  545. } UNIT_TABLE;
  546.  
  547. /*
  548.  *    SOFTWARE PARAMETER TABLE
  549.  *    
  550.  *    This table is used to store and control parameters applicable to the
  551.  *    Device Driver.  Some fields such as 'features' are changeable while
  552.  *    the Driver is active, others such as 'iopbs' are changeable when the
  553.  *    Driver is Installed. 
  554.  *      NOTE: See 754 Controller User's Manual - Set/Read Controller Parameters
  555.  */
  556. typedef struct
  557. {
  558.         unchar       ctlrs;      /* Number of controllers        */
  559.     unchar       units;      /* # of Unit Tables Configured */
  560.     unchar       partitions; /* # of Partition Tables per Unit Configured */
  561.     unchar       iopbs;      /* # of Iopbs Configured */
  562.     unchar       bufs;       /* # of Bufs Configured */
  563.     unchar       retries;    /* # of Command Retries Configured */
  564.     unchar       cycles;     /* # of Timeout() Cycles Iopb is allowed */
  565.     unchar       seconds;    /* # of Seconds in each Timeout() Cycle */
  566.     long       polls;      /* # of milliseconds to poll for iopb */
  567.     unchar       features;   /* Flags Dis/En-abling Driver Features */
  568.     unchar       modifier;   /* VME Address Modifier used in DMA */
  569. } SOFTWARE_TABLE;
  570.  
  571.  
  572. /* The following are Silicon Graphics specific structures:    */
  573. typedef struct
  574. {
  575.     unchar    code;            /* 754 completion code  */
  576.     char    *msg;            /* Corresponding message for code */
  577. } ERRTAB;
  578.  
  579.  
  580. /******************************************************************************
  581. DEFINE: ioctl_cmds.h - ioctl function constants 
  582. *******************************************************************************
  583. DESCRIPTION:
  584.          This file defines the constants for the ioctl functions.
  585.  
  586. ******************************************************************************/
  587.  
  588. #define    CTLRRESET    0x21    /* Controller Reset */        
  589. #define XYLBOTIOCTL     CTLRRESET /* This should always be defined to be the */
  590.                                   /* first xylogics ioctl.                   */ 
  591. #define    DRVRESET    0x22    /* Drive Reset */            
  592. #define    SETCTLRPAR    0x23    /* Set Controller Parameters */    
  593. #define    RDCTLRPAR    0x24    /* Read Controller Parameters */    
  594. #define    SETDRVPAR    0x25    /* Set Drive Parameters */        
  595. #define    RDDRVPAR    0x26    /* Read Drive Parameters */        
  596. #define    SETPARTS    0x27    /* Set Partition Parameters */    
  597. #define    RDPARTS        0x28    /* Read Partition Parameters */    
  598. #define    SETFORMPAR    0x29    /* Set Media Format Parameters */
  599. #define    RDFORMPAR    0x2a    /* Read Media Format Parameters */    
  600. #define    SETSWPAR    0x2b    /* Set Software Parameters */        
  601. #define    RDSWPAR        0x2c    /* Read Software Parameters */    
  602. #define    WRTTRKHDR    0x2d    /* Write Track Header */        
  603. #define    RDTRKHDR    0x2e    /* Read Track Header */        
  604. #define    WRTDATA        0x2f    /* Write Data */            
  605. #define    RDDATA        0x30    /* Read Data */        
  606. #define    RDIOPB        0x31    /* Read Iopbs */            
  607. #define    FORMAT        0x32    /* Format Tracks */            
  608. #define    WRTDEFECTS    0x33    /* Write Defect Map */        
  609. #define    RDDEFECTS    0x34    /* Read Defect Map */            
  610. #define    RDDEFEXT    0x35    /* Read Extended Defect Map */            
  611. #define DRVCONFIG    0x36    /* Show drive configuration */
  612. #define OPTIONAL    0x37    /* ESDI optional command    */ 
  613. #define AUTOCONFG    0x38     /* Auto Configuration command    */ 
  614. #define WRTVOLHDR    0x39    /* Write Volume Header    */
  615. #define XYLTOPIOCTL     WRTVOLHDR  /* This should always be defined to be */
  616.                                    /* the highest xylogics ioctl cmd.     */
  617.  
  618.  
  619. /*            ERROR_TYPE()
  620.  *
  621.  * IOPB completion codes follow a convention that indicates the action
  622.  * required for error recovery.  The byte's upper nibble is the
  623.  * recovery code and the lower nibble is the actual error code.
  624.  */
  625. #define ERROR_TYPE(comp_code)    ((comp_code >> 4) & 0x0f)
  626.  
  627. /*                       ASSIGN()
  628.  *
  629.  * Assigns a 32 bit value from one address to another
  630.  */
  631. #define ASSIGN(to,from)    *((long *)to) = *((long *)from) 
  632.  
  633. /* 
  634.  *                      RAW
  635.  *
  636.  * Returns TRUE if the buf is Raw (a locally generated buf) and FALSE
  637.  * if it is a system generated buf.
  638.  */
  639. #define RAW(bufptr)     (bufptr->b_flags & B_RAW)
  640.  
  641. #define XYL_CTLRS       4  /* max number of SMD controllers */
  642. #define XYL_CTLRUNITS   4  /* max units per SMD controller */
  643. #define IPI_CTLRS       4  /* max number of IPI controllers */
  644. #define IPI_CTLRUNITS  16  /* max units per IPI controller */
  645. #define IPI_IOPBS      16
  646. #define    PARTS           16  /* partitions per unit */
  647.  
  648.  
  649. /*
  650.  * SMD positional macros
  651.  */
  652.  
  653. /*             SMD_CTLR()
  654.  *
  655.  * This macro returns the controller number to which a minor device
  656.  * number is attached.  The system macro MINOR() is used to mask off
  657.  * the major device number.
  658.  */
  659. #define SMD_CTLR(dev)    ((minor(dev) / PARTS) / XYL_CTLRUNITS)
  660.  
  661. /*                       SMD_UNIT()
  662.  *
  663.  * This macro is used to calculate the physical unit number for a device.
  664.  * The system macro MINOR() is used to mask off the major device number.
  665.  * The physical unit number is the actual unit number.
  666.  */
  667. #define SMD_UNIT(dev)    ((minor(dev) / PARTS) % XYL_CTLRUNITS)
  668.  
  669. /*              SMD_PPOS()
  670.  *
  671.  * This macro is used to calculate the position in the Unit Tables for a
  672.  * device number.  The system macro MINOR() is used to mask off the major
  673.  * device number.  This is the position in the table for a physical unit
  674.  * for a specific controller.
  675.  */
  676. #define SMD_PPOS(dev)    (minor(dev) / PARTS)
  677.  
  678. /*            SMD_CTLRDEV()
  679.  *
  680.  * This macro returns the first physical unit attached to a controller.
  681.  */
  682. #define SMD_CTLRDEV(ctlr)    (ctlr * XYL_CTLRUNITS * PARTS)
  683.  
  684.  
  685. /*
  686.  * IPI positional macros
  687.  * IPI positional macros assume that the top 6 bits of the major number
  688.  * are the same and that the bottom two are the same as the controller
  689.  * number.  (i.e. (major_for_ctlr_2 & 3) == 2 and
  690.  * (major_for_ctlr_2 & 0xFC) == (major_for_ctlr_0 & 0xFC))
  691.  */
  692. #define IPI_SIGDEV    0x3FF    /* significant bits for macros */
  693.  
  694. /*            IPI_CTLR()
  695.  *
  696.  * This macro returns the controller number to which a minor device
  697.  * number is attached.  IPI_SIGDEV is used to mask off the unused bits of
  698.  * the major device number.
  699.  */
  700. #define IPI_CTLR(dev)    ((dev & IPI_SIGDEV) >> 8)
  701.  
  702. /*                      IPI_UNIT()
  703.  *
  704.  * This macro is used to calculate the physical unit number for a device.
  705.  * IPI_SIGDEV is used to mask off the unused bits of the major device number.
  706.  * The physical unit number is the actual unit number.
  707.  */
  708. #define IPI_UNIT(dev)    (((dev & IPI_SIGDEV) / PARTS) % IPI_CTLRUNITS)
  709.  
  710. /*            IPI_PPOS()
  711.  *
  712.  * This macro is used to calculate the position in the Unit Tables for a
  713.  * device number.  IPI_SIGDEV is used to mask off the unused bits of the major
  714.  * device number.  This is the position in the table for a physical unit
  715.  * for a specific controller.
  716.  */
  717. #define IPI_PPOS(dev)    ((dev & IPI_SIGDEV) / PARTS)
  718.  
  719. /*            IPI_CTLRDEV()
  720.  *
  721.  * This macro returns the first physical unit attached to a controller.
  722.  */
  723. #define IPI_CTLRDEV(ctlr)    (ctlr * IPI_CTLRUNITS * PARTS)
  724.  
  725.  
  726. /*            FS()
  727.  *
  728.  * Returns the partition number for a device.
  729.  * Assumes that the number of partitions is a factor of two.
  730.  */
  731. #define FS(dev)        (dev & (PARTS - 1))
  732.  
  733. /*
  734.  *                      SMD()
  735.  *
  736.  * Returns TRUE if the controller is a 752/754, and FALSE if it is
  737.  * a 712/714.
  738.  */
  739. #define SMD_TYPE        0x50    /* SMD controller type (752 or 754)       */
  740. #define ESDI_TYPE       0x10    /* ESDI controller type (712 or 714)      */
  741. #define SMD(ctlr)       ((xylcontroller[ctlr].c_type & SMD_TYPE) == SMD_TYPE)
  742.  
  743. #endif /* _XL_H_ */
  744.